﻿import type { RequestOptions } from '@@/plugin-request/request';
import { history, RequestConfig } from '@umijs/max';
import { Result } from '@/types/common/request';
import { SessionKey } from '@/util/session';
import { msgApi } from '@/util/msg';

/** token策略 */
export function getTokenHeader() {
  const token = sessionStorage.getItem(SessionKey.TOKEN);
  const tokenHead = sessionStorage.getItem(SessionKey.TOKEN_HEAD) || 'Bearer ';
  let authHeader = {};
  if (token) authHeader = { Authorization: `${tokenHead}${token}` };
  return authHeader;
}

const authHeaderInterceptor = (url: string, options: RequestOptions) => {
  let authHeader = undefined;
  if (options.token !== false) {
    authHeader = getTokenHeader();
  }
  return {
    url,
    options: {
      ...options,
      interceptors: true,
      headers: {
        ...options.headers,
        ...authHeader,
      },
    },
  };
};

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: (res: Result) => {
      console.log('errorThrower', res);
      if (!res.success) {
        const error: any = new Error(res.message);
        error.name = 'message';
        error.info = res;
        throw error; // 抛出自制的错误
      }
    },
    // 错误接收及处理
    errorHandler: (error: any, opts: any) => {
      if (opts?.skipErrorHandler) throw error;
      // 我们的 errorThrower 抛出的错误。
      // if (error.name === 'BizError') {
      const errorInfo: Result | undefined = error.info || error;
      // console.log('errorHandler', error)
      if (errorInfo) {
        const { code, message: msg } = errorInfo;
        console.log('errorInfo', errorInfo);
        // message.error(msg || '请求失败');
        msgApi.error(msg || '请求失败');
        switch (code) {
          case 404:
            history.push('/404');
            break;
          // case 401:
          // refresh()
          //   .then((res) => {
          //     const {userVO, accessToken, refreshToken, expireAt} = res.data;
          //     sessionStorage.setItem('token', accessToken);
          //     sessionStorage.setItem('refreshToken', refreshToken);
          //     sessionStorage.setItem('expireAt', expireAt);
          //     sessionStorage.setItem('userVO', JSON.stringify(userVO));
          //   })
          //   .catch(() => {
          //     sessionStorage.clear();
          //     if (window.location.pathname !== loginPath) {
          //       history.replace({
          //         pathname: loginPath,
          //       });
          //     }
          //   });
          // break;
          default:
          // history.replace({ pathname: loginPath });
        }
      }
    },
  },

  // 请求拦截器
  requestInterceptors: [
    authHeaderInterceptor,
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      const url = `${config.prefix}${config.url}`;
      // const url = `${isDev ? config.prefix : ''}${config.url}`; //拼接接口前缀，实现接口转发，跨域
      return { ...config, url };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // console.log('responseInterceptors', response)
      // 拦截响应数据，进行个性化处理
      return response;
    },
  ],
};
